#ifndef SNIFFER_H
#define SNIFFER_H

#include "datapackage.h"
#include "filter.h"

#include <QMainWindow>
#include <pcap.h>
#include <QVector>
#include <map>

QT_BEGIN_NAMESPACE
namespace Ui {
class Sniffer;
}
QT_END_NAMESPACE

class Sniffer : public QMainWindow
{
    Q_OBJECT

public:
    Sniffer(QWidget *parent = nullptr); // 构造函数
    ~Sniffer(); // 析构函数
    void showNetworkCards(); // 显示网络卡
    void showProtocols(); // 显示协议
    int capture(); // 捕获数据包
    void loadStyle(const QString &qssFile);
private slots:
    void on_comboBox_currentIndexChanged(int index); // 处理组合框索引变化
    void on_tableWidget_cellClicked(int  row, int column); // 处理表格单元格点击
    void on_comboBox_2_currentIndexChanged(int pro); // 处理组合框2索引变化
    void on_searchSrcIP_textChanged(const QString &text); // 处理源 IP 搜索框文本变化
    void on_searchDstIP_textChanged(const QString &text); // 处理目的 IP 搜索框文本变化


public slots:
    void HandleMessage(DataPackage data); // 处理数据包消息
    void HandlePair(std::pair<int, int> selected); // 处理选中的数据包对

private:
    Ui::Sniffer *ui; // UI指针
    pcap_if_t* alldevs; // 所有设备
    pcap_if_t* device; // 当前设备
    pcap_t* pointer; // pcap指针
    QVector<DataPackage>pData; // 数据包向量
    QVector<DataPackage>showData; // 显示的数据包向量
    int countNumber; // 计数器
    char errbuf[PCAP_ERRBUF_SIZE]; // 错误缓冲区
    int numberRow; // 行号
    Filter* filt; // 过滤器指针
    bool fi; // 过滤标志
    std::map<int, int> select; // 选中的数据包映射

    QString filterSrcIP; // 当前源 IP 过滤条件
    QString filterDstIP; // 当前目的 IP 过滤条件
    void applyFilters(); // 应用过滤条件
#define  MAXDATAFRAMES 1518 // 最大数据帧数

};
#endif // SNIFFER_H
